import axios from 'axios'
import { ElMessage } from 'element-plus'

// 创建axios实例
const request = axios.create({
  baseURL: 'http://localhost:5000/api', // 恢复/api前缀以匹配后端路由
  timeout: 15000 // 请求超时时间
})

// 请求拦截器
request.interceptors.request.use(
  config => {
    // 从localStorage获取token
    const token = localStorage.getItem('token')
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  error => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  response => {
    const res = response.data
    
    // 如果返回的是数组或普通对象，直接返回
    if (Array.isArray(res) || typeof res !== 'object' || res === null) {
      return { data: res, success: true }
    }
    
    // 如果返回的对象没有success字段，默认为成功
    if (res.success === undefined) {
      return { ...res, success: true }
    }
    
    // 如果返回的不是成功状态
    if (!res.success) {
      ElMessage.error(res.message || '操作失败')
      return Promise.reject(new Error(res.message || '操作失败'))
    }
    
    return res
  },
  error => {
    console.error('响应错误:', error)
    
    // 如果是取消的请求，不显示错误
    if (axios.isCancel(error)) {
      return Promise.reject(error)
    }
    
    // 处理不同的错误状态码
    const message = error.response?.data?.message || error.message
    switch (error.response?.status) {
      case 401:
        // 如果不是在登录页面，才进行跳转
        if (!window.location.pathname.includes('/login')) {
          ElMessage.error('请先登录')
          // 清除token和用户信息
          localStorage.removeItem('token')
          // 跳转到登录页
          window.location.href = '/login'
        } else {
          // 在登录页面，直接抛出错误，让登录组件处理
          ElMessage.error(message || '登录失败，请检查邮箱和密码')
        }
        break
      case 403:
        ElMessage.error('没有权限执行此操作')
        break
      case 404:
        // 不显示404错误，由调用方处理
        break
      case 500:
        ElMessage.error('服务器错误，请稍后重试')
        break
      default:
        // 只有在非401和非404的情况下才显示通用错误
        if (error.response?.status !== 401 && error.response?.status !== 404) {
          ElMessage.error(message)
        }
    }
    
    return Promise.reject(error)
  }
)

export default request